package SingletonHengry;
//通过同步代码块+双重校验锁解决线程安全问题并且提高效率。

/**
 * 懒汉式单例模式
 * 	在需要的时候才进行创建对象
 * 	单例模式的特点：
 1.构造方法私有化（即构造方法被private修饰）
 2.该单例对象必须由单例类自行创建
 3.内部提供一个公共静态的方法给外界进行访问（方法被public static 修饰）
*/
public class SingletonLazySafety {
    public static SingletonLazySafety s;
    //1、构造方法私有化
    public SingletonLazySafety(){}

    //3、内部提供一个公共静态的方法供外界进行访问
    public static SingletonLazySafety getInstance() {
        if (s == null) {
            // 双重校验锁  如果对象s为null（即没有被创建，则继续执行if里面的内容）
            // 使用同步代码块实现线程安全
            synchronized (SingletonLazySafety.class) {
                if(s == null) { // 如果s为null，就创建一个对象
                    s = new SingletonLazySafety(); // 2.该单例对象必须由单例类自行创建
                }
            }
        }
        return s;
    }

    public static void main(String[] args) {
        // 因为时static修饰的直接通过类名进行调用
        SingletonLazySafety i1 = SingletonLazySafety.getInstance();
        SingletonLazySafety i2 = SingletonLazySafety.getInstance();
        System.out.println("获取的对象是否相同："+(i1==i2));
    }

}

/**
 * 综合得出一个链式结论：
 * 懒汉式单例模式：多线程访问时不安全-->加锁（线程同步方法）-->解决线程安全问题-->
 * 出现效率低的问题（因为多线程访问需要等一个线程执行结束过后才执行）-->双重校验锁-->解决效率问题。
 */